
#include "FabricasObjetosJuego.h"

vector<ObjetoEstatico*> GestionFabricas::objetosEstaticos;
vector<ObjetoMovible*> GestionFabricas::objetosMovibles;
int GestionFabricas::maximoX;
int GestionFabricas::maximoY;
int GestionFabricas::piso;
int GestionFabricas::gravedad;

void GestionFabricas::Inicializar(int maximoX, int maximoY, int piso, int gravedad) {
	
	GestionFabricas::maximoX = maximoX;
	GestionFabricas::maximoY = maximoY;
	GestionFabricas::piso = piso;
	GestionFabricas::gravedad = gravedad;
	srand ( time(NULL) );
}

vector<ObjetoEstatico*> GestionFabricas::getEstaticosCreados() {
	
	vector<ObjetoEstatico*> estaticos = GestionFabricas::objetosEstaticos;
	objetosEstaticos.clear();
	return estaticos;
}

vector<ObjetoMovible*> GestionFabricas::getMoviblesCreados() {
	
	vector<ObjetoMovible*> movibles = GestionFabricas::objetosMovibles;
	objetosMovibles.clear();
	return movibles;
}

namespace nsObjetosEnemigos {
	
	const int Hongo = 0;
	const int Tortuga = 1;
	const int Bomba = 2;
	const int Size = 3;
}

void FabricaEnemigos::CrearObjeto(int x, int y, Orientacion orientacion) {
	
	int tipoObjeto = rand() % nsObjetosEnemigos::Size;

	switch(tipoObjeto) {
		case nsObjetosEnemigos::Hongo: {
			Hongo* hongo = new Hongo(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
			GestionTiposEnemigos::AsignarTipoEnemigo(hongo);
			if (orientacion == Derecha) hongo->setPosicion(x, y - hongo->getAlto());
			if (orientacion == Izquierda) hongo->setPosicion(x - hongo->getAncho(), y - hongo->getAlto());
			hongo->setPiso(GestionFabricas::piso);
			hongo->setGravedad(GestionFabricas::gravedad);
			GestionFabricas::objetosMovibles.push_back(hongo);
			break;
		}
		case nsObjetosEnemigos::Tortuga : {
			Tortuga* tortuga = new Tortuga(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
			GestionTiposEnemigos::AsignarTipoEnemigo(tortuga);
			if (orientacion == Derecha) tortuga->setPosicion(x, y - tortuga->getAlto());
			if (orientacion == Izquierda) tortuga->setPosicion(x - tortuga->getAncho(), y - tortuga->getAlto());
			tortuga->setPiso(GestionFabricas::piso);
			tortuga->setGravedad(GestionFabricas::gravedad);
			GestionFabricas::objetosMovibles.push_back(tortuga);
			break;
		}
		case nsObjetosEnemigos::Bomba : {
			Bomba* bomba = new Bomba(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
			GestionTiposEnemigos::AsignarTipoEnemigo(bomba);
			if (orientacion == Derecha) bomba->setPosicion(x, y - bomba->getAlto());
			if (orientacion == Izquierda) bomba->setPosicion(x - bomba->getAncho(), y - bomba->getAlto());
			bomba->setPiso(GestionFabricas::piso);
			bomba->setGravedad(GestionFabricas::gravedad);
			GestionFabricas::objetosMovibles.push_back(bomba);
			break;
		}
	};
	
}

namespace nsObjetosBonus {
	
	const int Armadura = 0;
	const int VidaExtra = 1;
	const int EstrellaInvencibilidad = 2;
	const int Volador = 3;
	const int Size = 4;
}

void FabricaBonus::CrearObjeto(int x, int y, Orientacion orientacion) {

	int tipoObjeto = rand() % nsObjetosBonus::Size;
	
	switch(tipoObjeto) {
		case nsObjetosBonus::Armadura: {
			Armadura* armadura = new Armadura(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
			GestionTiposBonus::AsignarTipoBonus(armadura);
			armadura->setPosicion(x, y - armadura->getAlto());
			armadura->setPiso(GestionFabricas::piso);
			armadura->setGravedad(GestionFabricas::gravedad);
			armadura->setVelocidadY(150);
			GestionFabricas::objetosMovibles.push_back(armadura);
			break;
		}
		case nsObjetosBonus::VidaExtra : {
			VidaExtra* vidaExtra = new VidaExtra(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
			GestionTiposBonus::AsignarTipoBonus(vidaExtra);
			vidaExtra->setPosicion(x, y - vidaExtra->getAlto());
			vidaExtra->setPiso(GestionFabricas::piso);
			vidaExtra->setGravedad(GestionFabricas::gravedad);
			vidaExtra->setVelocidadY(150);
			GestionFabricas::objetosMovibles.push_back(vidaExtra);
			break;
		}
		case nsObjetosBonus::EstrellaInvencibilidad : {
			EstrellaInvencibilidad* estrellaInvencibilidad = new EstrellaInvencibilidad(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
			GestionTiposBonus::AsignarTipoBonus(estrellaInvencibilidad);
			estrellaInvencibilidad->setPosicion(x, y - estrellaInvencibilidad->getAlto());
			estrellaInvencibilidad->setPiso(GestionFabricas::piso);
			estrellaInvencibilidad->setGravedad(GestionFabricas::gravedad);
			estrellaInvencibilidad->setVelocidadY(150);
			GestionFabricas::objetosMovibles.push_back(estrellaInvencibilidad);
			break;
		}
		case nsObjetosBonus::Volador : {
			Volador* volador = new Volador(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
			GestionTiposBonus::AsignarTipoBonus(volador);
			volador->setPosicion(x, y - volador->getAlto());
			volador->setPiso(GestionFabricas::piso);
			volador->setGravedad(GestionFabricas::gravedad);
			volador->setVelocidadY(150);
			GestionFabricas::objetosMovibles.push_back(volador);
			break;
		}
	};
}

void FabricaBarriles::CrearObjeto(int x, int y, Orientacion orientacion) {
	
	Barril* barril = new Barril(x, y, GestionFabricas::maximoX, GestionFabricas::maximoY, orientacion);
	GestionTiposEnemigos::AsignarTipoEnemigo(barril);
	if (orientacion == Derecha) barril->setPosicion(x, y - barril->getAlto());
	if (orientacion == Izquierda) barril->setPosicion(x - barril->getAncho(), y - barril->getAlto());
	barril->setPiso(GestionFabricas::piso);
	barril->setGravedad(GestionFabricas::gravedad);
	GestionFabricas::objetosMovibles.push_back(barril);
}
